package rjcs;


import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 测试数据
/*
2020年1月0日
二零二零年一月一日
2020年一月二日
2020年1月3日
2020年01月4日
2020年01月05日
2020-1-6
2020-01-7
2020-01-08
2020/1/9
2020/01/10
2020.1.11
2020.01.12
2020、1、13
2020、01、14
2020/1、15
2020、1/16
2020年1、17
2020、1月18
2020、一、十九
2020、1、30
2020、1月31
2020、1月32
二零二零年2月28日
2020年二月29日
2020年2月30日
2021年2月28日
2021年2月29日
888年二月21日
不想写测试用例了，谁有空补充一下
 */
public class DateTest {
    private static final String DATE_REGEX = "(\\d{1,4}|[零一二三四五六七八九十]{1,8})[-/年.、]?(\\d{1,2}|[零一二三四五六七八九十]{1,2})[-/月.、]?(\\d{1,2}|[零一二三四五六七八九十]{1,3})日?";
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            String input = scanner.nextLine();
            System.out.println("输入的日期是:" + input);
            try {
                System.out.println(parseDate(input));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

    public static String parseDate(String input) throws Exception {
        Pattern pattern = Pattern.compile(DATE_REGEX);
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            String yearStr = matcher.group(1);
            String monthStr = matcher.group(2);
            String dayStr = matcher.group(3);
            int year = convertChineseNumber(yearStr);
            int month = convertChineseNumber(monthStr);
            int day = convertChineseNumber(dayStr);
            if (!isValidDate(year, month, day)) {
                throw new Exception("无效的日期");
            }
            return String.format("%d年%d月%d日", year, month, day);
        } else {
            throw new Exception("未找到符合要求的日期格式");
        }
    }

    private static int convertChineseNumber(String chineseNumber) {
        if (chineseNumber.matches("\\d+")) {
            return Integer.parseInt(chineseNumber);
        }
        char[] keys = {'零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '〇'};
        int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        Map<Character, Integer> digits = new HashMap<>();
        for (int i = 0; i < keys.length; i++) {
            digits.put(keys[i], values[i]);
        }
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < chineseNumber.length(); i++) {
            char c = chineseNumber.charAt(i);
            if (digits.containsKey(c)) {
                result.append(digits.get(c));
            } else if (c == '十') {
                if (chineseNumber.length() == 1)
                    result.append("10");
                else if (i == 0)
                    result.append("1");
                else if (i == chineseNumber.length() - 1)
                    result.append("0");
            }
        }
        return Integer.parseInt(result.toString());
    }

    private static boolean isValidDate(int year, int month, int day) {
        if (month < 1 || month > 12) return false;
        if (day < 1) return false;
        int[] daysInMonth = {31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        return day <= daysInMonth[month - 1];
    }

    private static boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}